module(...)
{% for k in keys %}
{% if k.startswith('_') or (k.startswith('CG') and class == 'server') or (k.startswith('GC') and class == 'client') %}
function {{k}}Decode(Msg)
    local result={}

{% for n,t,l in context[k] %}

{% if l ==  1%}
{% if t == 'byte' %}    
    result.{{n}} = Msg:ReadByte() 
{% elif t == 'short' %}    
    result.{{n}} = Msg:ReadShort() 
{% elif t == 'int' %}    
    result.{{n}} = Msg:ReadInt() 
{% elif isnode(t) %}
    result.{{n}} = {{modname[t]}}Decode(Msg);
{% endif %}
{% endif %}

{% if l > 1 %}
{% if t == 'string' %}
    result.{{n}} = Msg:ReadString()
{% else %}
    result.{{n}} = {}
    size = Msg:ReadShort()
    for i=1, size do
    {% if t == 'byte' %}
        result.{{n}}[i] = Msg:ReadByte()
    {% elif t == 'short' %}    
        result.{{n}}[i] = Msg:ReadShort()
    {% elif t == 'int' %}    
        result.{{n}}[i] = Msg:ReadInt()
    {% elif isnode(t) %}
        result.{{n}}[i] = {{modname[t]}}Decode(Msg)
    {% endif %}
    end
{% endif %}
{% endif %}

{% endfor %}
    return result
end
{% endif %}

{% if k.startswith('_') or (k.startswith('CG') and class == 'client') or (k.startswith('GC') and class == 'server') %}
function {{k}}Encode(Msg,Data)
{% for n,t,l in context[k] %}
{% if l ==  1%}
{% if t == 'byte' %}    
    Msg:WriteByte(Data.{{n}}) 
{% elif t == 'short' %}    
    Msg:WriteShort(Data.{{n}}) 
{% elif t == 'int' %}    
    Msg:WriteInt(Data.{{n}}) 
{% elif isnode(t) %}    
    {{modname[t]}}Encode(Msg, Data.{{n}})
{% endif %}
{% endif %}

{% if l>1 %}
{% if t == 'string' %}
    Msg:WriteString(Data.{{n}}, #Data.{{n}})
{% else %}
    Msg:WriteShort(#Data.{{n}})
    for i=1,#Data.{{n}} do
    {% if t == 'byte' %}
        Msg:WriteByte(Data.{{n}}[i])
    {% elif t == 'short' %}    
        Msg:WriteShort(Data.{{n}}[i])
    {% elif t == 'int' %}    
        Msg:WriteInt(Data.{{n}}[i])
    {% elif isnode(t) %}    
        {{modname[t]}}Encode(Msg, Data.{{n}})
    {% endif %}
    end
{% endif %}
{% endif %}

{% endfor %}
end
{% endif %}

{% endfor %}
